--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
nomadnet/ui/textui/Guide.py 72f623293e09561aa0f7aa69990882b6fb5c9752 (72f62329) Text, 6.58 KB
Tff7b72import T7ee787RNS
Tff7b72import T7ee787urwid
Tff7b72import T7ee787nomadnet
Tff7b72from T7ee787nomadnetT7ee787.T7ee787vendorT7ee787.T7ee787additional_urwid_widgets Tff7b72import Te6edf3IndicativeListBoxTb4b4b4, Te6edf3MODIFIER_KEY
Tff7b72from T7ee787.T7ee787MarkupParser Tff7b72import Te6edf3markup_to_attrmaps
Tff7b72class T56d364GuideDisplayShortcutsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3appTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffapp Tff7b72= Te6edf3app
Te6edf3g Tff7b72= Te6edf3appTff7b72.Td2a8ffuiTff7b72.Td2a8ffglyphs
Tff7b72selfTff7b72.Td2a8ffwidget Tff7b72= Te6edf3urwidTff7b72.Td2a8ffAttrMapTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffTextTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffshortcutbarTa5d6ff"Tb4b4b4)
Tff7b72class T56d364ListEntryTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffTextTb4b4b4)Tb4b4b4:
Te6edf3_selectable Tff7b72= Tff7b72True
Te6edf3signals Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffclickTa5d6ff"Tb4b4b4]
Tff7b72def Td2a8ffkeypressTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sizeTb4b4b4, Te6edf3keyTb4b4b4)Tb4b4b4:
T8b949e"""
Send 'click' signal on 'activate' command.
"""
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_command_mapTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72!= Te6edf3urwidTff7b72.Td2a8ffACTIVATETb4b4b4:
Tff7b72return Te6edf3key
Tff7b72selfTff7b72.Td2a8ff_emitTb4b4b4(Ta5d6ff'Ta5d6ffclickTa5d6ff'Tb4b4b4)
Tff7b72def Td2a8ffmouse_eventTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sizeTb4b4b4, Te6edf3eventTb4b4b4, Te6edf3buttonTb4b4b4, Te6edf3xTb4b4b4, Te6edf3yTb4b4b4, Te6edf3focusTb4b4b4)Tb4b4b4:
T8b949e"""
Send 'click' signal on button 1 press.
"""
Tff7b72if Te6edf3button Tff7b72!= T79c0ff1 Tff7b72or Tff7b72not Te6edf3urwidTff7b72.Td2a8ffutilTff7b72.Td2a8ffis_mouse_pressTb4b4b4(Te6edf3eventTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_emitTb4b4b4(Ta5d6ff'Ta5d6ffclickTa5d6ff'Tb4b4b4)
Tff7b72return Tff7b72True
Tff7b72class T56d364SelectTextTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffTextTb4b4b4)Tb4b4b4:
Te6edf3_selectable Tff7b72= Tff7b72True
Te6edf3signals Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffclickTa5d6ff"Tb4b4b4]
Tff7b72def Td2a8ffkeypressTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sizeTb4b4b4, Te6edf3keyTb4b4b4)Tb4b4b4:
T8b949e"""
Send 'click' signal on 'activate' command.
"""
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_command_mapTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72!= Te6edf3urwidTff7b72.Td2a8ffACTIVATETb4b4b4:
Tff7b72return Te6edf3key
Tff7b72selfTff7b72.Td2a8ff_emitTb4b4b4(Ta5d6ff'Ta5d6ffclickTa5d6ff'Tb4b4b4)
Tff7b72def Td2a8ffmouse_eventTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sizeTb4b4b4, Te6edf3eventTb4b4b4, Te6edf3buttonTb4b4b4, Te6edf3xTb4b4b4, Te6edf3yTb4b4b4, Te6edf3focusTb4b4b4)Tb4b4b4:
T8b949e"""
Send 'click' signal on button 1 press.
"""
Tff7b72if Te6edf3button Tff7b72!= T79c0ff1 Tff7b72or Tff7b72not Te6edf3urwidTff7b72.Td2a8ffutilTff7b72.Td2a8ffis_mouse_pressTb4b4b4(Te6edf3eventTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_emitTb4b4b4(Ta5d6ff'Ta5d6ffclickTa5d6ff'Tb4b4b4)
Tff7b72return Tff7b72True
Tff7b72class T56d364GuideEntryTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffWidgetWrapTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3appTb4b4b4, Te6edf3readerTb4b4b4, Te6edf3topic_nameTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffapp Tff7b72= Te6edf3app
Tff7b72selfTff7b72.Td2a8ffreader Tff7b72= Te6edf3reader
Te6edf3g Tff7b72= Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffuiTff7b72.Td2a8ffglyphs
Te6edf3widget Tff7b72= Te6edf3ListEntryTb4b4b4(Te6edf3topic_nameTb4b4b4)
Te6edf3urwidTff7b72.Td2a8ffconnect_signalTb4b4b4(Te6edf3widgetTb4b4b4, Ta5d6ff"Ta5d6ffclickTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffdisplay_topicTb4b4b4, Te6edf3topic_nameTb4b4b4)
Te6edf3style Tff7b72= Ta5d6ff"Ta5d6fflist_normalTa5d6ff"
Te6edf3focus_style Tff7b72= Ta5d6ff"Ta5d6fflist_focusTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffdisplay_widget Tff7b72= Te6edf3urwidTff7b72.Td2a8ffAttrMapTb4b4b4(Te6edf3widgetTb4b4b4, Te6edf3styleTb4b4b4, Te6edf3focus_styleTb4b4b4)
Te6edf3urwidTff7b72.Td2a8ffWidgetWrapTff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdisplay_widgetTb4b4b4)
Tff7b72def Td2a8ffdisplay_topicTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3eventTb4b4b4, Te6edf3topicTb4b4b4)Tb4b4b4:
Te6edf3markup Tff7b72= Te6edf3TOPICSTb4b4b4[Te6edf3topicTb4b4b4]
Te6edf3attrmaps Tff7b72= Te6edf3markup_to_attrmapsTb4b4b4(Te6edf3markupTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffreaderTff7b72.Td2a8ffset_content_widgetsTb4b4b4(Te6edf3attrmapsTb4b4b4)
Tff7b72class T56d364TopicListTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffWidgetWrapTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3appTb4b4b4, Te6edf3guide_displayTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffapp Tff7b72= Te6edf3app
Te6edf3g Tff7b72= Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffuiTff7b72.Td2a8ffglyphs
Tff7b72selfTff7b72.Td2a8fftopic_list Tff7b72= Tb4b4b4[
Te6edf3GuideEntryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Te6edf3guide_displayTb4b4b4, Ta5d6ff"Ta5d6ffIntroductionTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3GuideEntryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Te6edf3guide_displayTb4b4b4, Ta5d6ff"Ta5d6ffConversationsTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3GuideEntryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Te6edf3guide_displayTb4b4b4, Ta5d6ff"Ta5d6ffMarkupTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3GuideEntryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Te6edf3guide_displayTb4b4b4, Ta5d6ff"Ta5d6ffLicenses & CreditsTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffilb Tff7b72= Te6edf3IndicativeListBoxTb4b4b4(
Tff7b72selfTff7b72.Td2a8fftopic_listTb4b4b4,
Te6edf3initialization_is_selection_changeTff7b72=Tff7b72FalseTb4b4b4,
Tb4b4b4)
Te6edf3urwidTff7b72.Td2a8ffWidgetWrapTff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3urwidTff7b72.Td2a8ffLineBoxTb4b4b4(Tff7b72selfTff7b72.Td2a8ffilbTb4b4b4, Te6edf3titleTff7b72=Ta5d6ff"Ta5d6ffTopicsTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffkeypressTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sizeTb4b4b4, Te6edf3keyTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3key Tff7b72== Ta5d6ff"Ta5d6ffupTa5d6ff" Tff7b72and Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffilbTff7b72.Td2a8fffirst_item_is_selectedTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3nomadnetTff7b72.Td2a8ffNomadNetworkAppTff7b72.Td2a8ffget_shared_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffuiTff7b72.Td2a8ffmain_displayTff7b72.Td2a8ffframeTff7b72.Td2a8ffset_focusTb4b4b4(Ta5d6ff"Ta5d6ffheaderTa5d6ff"Tb4b4b4)
Tff7b72return Tffa657superTb4b4b4(Te6edf3TopicListTb4b4b4, Tff7b72selfTb4b4b4)Tff7b72.Td2a8ffkeypressTb4b4b4(Te6edf3sizeTb4b4b4, Te6edf3keyTb4b4b4)
Tff7b72class T56d364GuideDisplayTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3list_width Tff7b72= T79c0ff0.33
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3appTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffapp Tff7b72= Te6edf3app
Te6edf3g Tff7b72= Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffuiTff7b72.Td2a8ffglyphs
Te6edf3topic_text Tff7b72= Te6edf3urwidTff7b72.Td2a8ffTextTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ffNo topic selectedTa5d6ff"Tb4b4b4, Te6edf3alignTff7b72=Ta5d6ff"Ta5d6ffleftTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffleft_area Tff7b72= Te6edf3TopicListTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Tff7b72selfTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffright_area Tff7b72= Te6edf3urwidTff7b72.Td2a8ffLineBoxTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffFillerTb4b4b4(Te6edf3topic_textTb4b4b4, Ta5d6ff"Ta5d6fftopTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcolumns Tff7b72= Te6edf3urwidTff7b72.Td2a8ffColumnsTb4b4b4(
Tb4b4b4[
Tb4b4b4(Ta5d6ff"Ta5d6ffweightTa5d6ff"Tb4b4b4, Te6edf3GuideDisplayTff7b72.Td2a8fflist_widthTb4b4b4, Tff7b72selfTff7b72.Td2a8ffleft_areaTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffweightTa5d6ff"Tb4b4b4, T79c0ff1Tff7b72-Te6edf3GuideDisplayTff7b72.Td2a8fflist_widthTb4b4b4, Tff7b72selfTff7b72.Td2a8ffright_areaTb4b4b4)
Tb4b4b4]Tb4b4b4,
Te6edf3dividecharsTff7b72=T79c0ff0Tb4b4b4, Te6edf3focus_columnTff7b72=T79c0ff0
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffshortcuts_display Tff7b72= Te6edf3GuideDisplayShortcutsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwidget Tff7b72= Tff7b72selfTff7b72.Td2a8ffcolumns
Tff7b72def Td2a8ffset_content_widgetsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3new_contentTb4b4b4)Tb4b4b4:
Te6edf3options Tff7b72= Tff7b72selfTff7b72.Td2a8ffcolumnsTff7b72.Td2a8ffoptionsTb4b4b4(Te6edf3width_typeTff7b72=Ta5d6ff"Ta5d6ffweightTa5d6ff"Tb4b4b4, Te6edf3width_amountTff7b72=T79c0ff1Tff7b72-Te6edf3GuideDisplayTff7b72.Td2a8fflist_widthTb4b4b4)
Te6edf3pile Tff7b72= Te6edf3urwidTff7b72.Td2a8ffPileTb4b4b4(Te6edf3new_contentTb4b4b4)
Te6edf3content Tff7b72= Te6edf3urwidTff7b72.Td2a8ffLineBoxTb4b4b4(Te6edf3urwidTff7b72.Td2a8ffFillerTb4b4b4(Te6edf3pileTb4b4b4, Ta5d6ff"Ta5d6fftopTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcolumnsTff7b72.Td2a8ffcontentsTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= Tb4b4b4(Te6edf3contentTb4b4b4, Te6edf3optionsTb4b4b4)
Tff7b72def Td2a8ffshortcutsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffshortcuts_display
Te6edf3TOPIC_INTRODUCTION Tff7b72= Ta5d6ff'''Ta5d6ff>Nomad Network
Ta5d6ffCommunicate Freely.
Ta5d6ffNomad Network is built using Reticulum
Ta5d6ff-~
Ta5d6ff## Notable Features
Ta5d6ff - Encrypted messaging over packet-radio, LoRa, WiFi or anything else [Reticulum](https://github.com/markqvist/Reticulum) supports.
Ta5d6ff - Zero-configuration, minimal-infrastructure mesh communication
Ta5d6ff-
Ta5d6ff## Current Status
Ta5d6ffPre-alpha. At this point Nomad Network is usable as a basic messaging client over Reticulum networks, but only the very core features have been implemented. Development is ongoing and current features being implemented are:
Ta5d6ff - Propagated messaging and discussion threads
Ta5d6ff - Connectable nodes that can host pages, files and other resources
Ta5d6ff - Collaborative information sharing and spatial map-style Ta5d6ff"Ta5d6ffwikisTa5d6ff"
Ta5d6ff-
Ta5d6ff## Dependencies:
Ta5d6ff - Python 3
Ta5d6ff - RNS
Ta5d6ff - LXMF
Ta5d6ff```
Ta5d6ffTo use Nomad Network on packet radio or LoRa, you will need to configure your Reticulum installation
Ta5d6ffto use any relevant packet radio TNCs or LoRa devices on your system. See the Reticulum documentation
Ta5d6ff for info.
Ta5d6ff## Caveat Emptor
Ta5d6ffNomad Network is experimental software, and should be considered as such. While it has been built wit
Ta5d6ffh cryptography best-practices very foremost in mind, it _has not_ been externally security audited, a
Ta5d6ffnd there could very well be privacy-breaking bugs. If you want to help out, or help sponsor an audit,
Ta5d6ff please do get in touch.
Ta5d6ff'''
Te6edf3TOPIC_CONVERSATIONS Tff7b72= Ta5d6ff'''Ta5d6ffConversations
Ta5d6ff=============
Ta5d6ffConversations in Nomad Network
Ta5d6ff'''
Te6edf3TOPIC_MARKUP Tff7b72= Ta5d6ff'''Ta5d6ff>Markup
Ta5d6ffNomad Network supports a simple and functional markup language called micron. It has a lean markup structure that adds very little overhead, and is still readable as plain text, but offers basic formatting and text structuring, ideal for displaying in a terminal.
Ta5d6ffLorem ipsum dolor sit amet.
Ta5d6ff>>Encoding
Ta5d6ff`F222`BdddAll uM source files are encoded as UTF-8, and clients supporting uM display should support UTF-8.
Ta5d6ff``
Ta5d6ff>>>Sections and `F900Headings`f
Ta5d6ffYou can define an arbitrary number of sections and sub-sections, each with their own heading
Ta5d6ff-
Ta5d6ffDividers inside section will adhere to section indents
Ta5d6ff>>>>
Ta5d6ffIf no heading text is defined, the section will appear as a sub-section without a header.
Ta5d6ff<-
Ta5d6ffHorizontal dividers can be inserted
Ta5d6ffText `F2cccan`f be `_underlined`_, `!bold`! or `*italic`*. You `F000`B2cccan`b`f also `_`*`!combine formatting``!
Ta5d6ff'''
Te6edf3TOPICS Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffIntroductionTa5d6ff"Tb4b4b4: Te6edf3TOPIC_INTRODUCTIONTb4b4b4,
Ta5d6ff"Ta5d6ffConversationsTa5d6ff"Tb4b4b4: Te6edf3TOPIC_CONVERSATIONSTb4b4b4,
Ta5d6ff"Ta5d6ffMarkupTa5d6ff"Tb4b4b4: Te6edf3TOPIC_MARKUPTb4b4b4,
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────